package cfgReader

import "gitee.com/wchpub/fnsvr"

// 一张表
type Table struct {
	rows           []interface{}
	rowIndexIntKey map[int]interface{} //:{[key:string|number]:any} = {}
	maxKey         int
}

// 新建一行的函数
type NewRowFunc func(row []interface{}) interface{}

// 加载表格
func (myself *Table) Load(newRowFunc NewRowFunc, filePath string) error {
	//ext:=path.Ext(filePath)
	txt, err := fnsvr.ReadAllText(filePath)
	if err != nil {
		return err
	}

	jsonDoc := TableDecoder.Decode(txt)

	//从第2行开始读取数据
	rowCount := len(jsonDoc)
	maxK := 0
	for i := 1; i < rowCount; i++ {
		row := jsonDoc[i]
		key := int(row[0].(float64))
		data := newRowFunc(row)
		myself.rowIndexIntKey[key] = data
		myself.rows = append(myself.rows, data)
		if key > maxK {
			maxK = key
		}
	}
	myself.maxKey = maxK

	return nil
}

//抽象表类型
type ITable interface {
	GetTableName() string
}

// 根据Key获取表中的一行
func GetRow[T ITable](t *Table, key int) (T, bool) {
	v, ok := t.rowIndexIntKey[key]
	if !ok {
		var zero T
		//返回T的0值
		return zero, false
	}
	re, ok := v.(T)
	if !ok {
		var zero T
		//返回T的0值
		return zero, false
	}

	return re, true
}

// 检查函数
type RowCheckFunc[T ITable] func(row T) bool

// 查询并返回符合条件的数据
func FindRow[T ITable](t *Table, checkFunc RowCheckFunc[T]) []T {
	re := []T{}
	for _, row := range t.rowIndexIntKey {
		irow := row.(T)

		if checkFunc(irow) {
			re = append(re, irow)
		}
	}
	return re
}

// 顺序遍历配置表
func Foreach[T ITable](t *Table, call RowCheckFunc[T]) {
	for _, row := range t.rows {
		irow := row.(T)
		if !call(irow) {
			break
		}
	}
}

func GetRowByIndex[T ITable](t *Table, idx int) T {
	if idx < 0 || idx > len(t.rows)-1 {
		var zero T
		return zero
	}
	return t.rows[idx].(T)
}

func (myself *Table) MaxKey() int {
	return myself.maxKey
}

func (myself *Table) RowCnt() int {
	return len(myself.rows)
}

func GetLastRow[T ITable](t *Table) T {
	return t.rows[len(t.rows)-1].(T)
}

// 新建一个表实例
func NewTable() *Table {
	re := &Table{}
	re.rowIndexIntKey = make(map[int]interface{})
	return re
}
